//
//  UserAccountViewModel.swift
//  weibo10
//
//  Created by 猎人 on 15/10/22.
//  Copyright © 2015年 hunter. All rights reserved.
//

import Foundation

/// 用户账号视图模型
class UserAccountViewModel {
    
     /// 单例 - 解决避免重复从沙盒加载 归档 文件，提高效率，让 access_token 便于被访问到
    static let sharedUserAccount = UserAccountViewModel()
    /// 用户模型
    var userAccount:UserAccount?
    
    /// 返回有效的token
    var accessToken: String? {
        if !isExpired {
            return userAccount?.access_token
        }
        return nil
    }
    
    /// 用户登录标记
    var userLogon:Bool {
        
        //如果token不为空且没有过期，则登陆
        return userAccount?.access_token != nil && !isExpired
    }
    
    /// 用户头像
    var avatarUrl: NSURL {
        return NSURL(string: userAccount?.avatar_large ?? "")!
    }
    
    /// 归档保存的路径 - 计算型属性(类似于有返回值的函数，可以让调用的时候，语义会更清晰)
    private var accountPath: String {
        let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last!
        
        return (path as NSString).stringByAppendingPathComponent("account.plist")
    }
    
    /// 判断账户是否过期
    private var isExpired: Bool {
        // 判断用户账户过期日期与当前系统日期`进行比较`
        // 自己改写日期，测试逻辑是否正确，创建日期的时候，如果给定 负数，返回比当前时间早的日期
        // account?.expiresDate = NSDate(timeIntervalSinceNow: -3600)
        
        // 如果 account 为 nil，不会调用后面的属性，后面的比较也不会继续...
        if userAccount?.expiresDate?.compare(NSDate()) == NSComparisonResult.OrderedDescending {
            // 代码执行到此，一定进行过比较！
            return false
        }

        //过期，返回true
        return true
        
    }
    
    /// 构造函数
    init() {
        
        //从沙盒解档数据
        userAccount = NSKeyedUnarchiver.unarchiveObjectWithFile(accountPath) as? UserAccount
        
        //如果已经过期
        if isExpired {
            print("账号过期了")
            userAccount = nil
        }
    }
}

// MARK: - 网络相关方法
extension UserAccountViewModel{
    /// 加载token
    ///
    /// - parameter code:     授权码
    /// - parameter finished: 完成回调（是否成功）
    func loadAccessToken(code: String, finished: (isSuccessed: Bool)->()) {
        NetWorkTools.sharedTools.loadAccessToken(code) { (result, error) -> () in
            
            //判断错误
            if error != nil {
                print("出错了")
                
                //失败的回调
                finished(isSuccessed: false)
                return
            }
            
            //输出结果
            self.userAccount = UserAccount(dict: result as! [String: AnyObject])
            
            //加载用户数据
            self.loadUserInfo(self.userAccount!, finished: finished)
            
        }
    }
    
    /// 加载用户信息
    ///
    /// - parameter account:  用户账号
    private func loadUserInfo(account: UserAccount, finished: (isSuccessed: Bool)->()) {
        NetWorkTools.sharedTools.loadUserInfo(account.uid!) { (result, error) -> () in
            
            if error != nil {
                
                print("加载用户错误")
                
                finished(isSuccessed: false)
                return
            }
            
            guard let dict = result as? [String: AnyObject] else {
                
                print("格式错误")
                
                finished(isSuccessed: false)
                return
            }
            
            account.screen_name = dict["screen_name"] as? String
            account.avatar_large = dict["avatar_large"] as? String
            
            //保存对象
            NSKeyedArchiver.archiveRootObject(account, toFile: self.accountPath)
            //完成回调
            finished(isSuccessed: true)
        }
    }
    
}
